import { useMemberStore } from '@/stores/modules/member'
import { getUserInfo } from '@/Api/load/load'

/**
 * 用户信息管理工具类
 */
export class UserManager {
  // 懒加载 store，避免在 Pinia 初始化前调用
  private static get memberStore() {
    return useMemberStore()
  }

  /**
   * 获取当前用户信息
   * @returns 用户信息对象
   */
  static getCurrentUser() {
    return this.memberStore.profile
  }

  /**
   * 获取用户姓名
   * @returns 用户姓名，如果没有则返回默认值
   */
  static getUserName(): string {
    return this.memberStore.profile?.nickname || this.memberStore.profile?.name || '用户'
  }

  /**
   * 获取用户部门
   * @returns 用户部门，如果没有则返回默认值
   */
  static getUserDepartment(): string {
    return this.memberStore.profile?.deptName || this.memberStore.profile?.department || '办公室'
  }

  /**
   * 获取用户职位
   * @returns 用户职位，如果没有则返回默认值
   */
  static getUserPosition(): string {
    return this.memberStore.profile?.job || this.memberStore.profile?.position || '员工'
  }

  /**
   * 获取用户头像首字母
   * @returns 用户姓名首字母，如果没有则返回 'U'
   */
  static getUserAvatarText(): string {
    const name = this.getUserName()
    return name.charAt(0) || 'U'
  }

  /**
   * 检查用户是否已登录
   * @returns 是否已登录
   */
  static isLoggedIn(): boolean {
    return !!this.memberStore.profile
  }

  /**
   * 从服务器获取并更新用户信息
   * @returns Promise<boolean> 是否成功获取用户信息
   */
  static async fetchAndUpdateUserInfo(): Promise<boolean> {
    try {
      const response = await getUserInfo()
      if (response.data) {
        this.memberStore.setProfile(response.data)
        console.log('用户信息已更新:', response.data)
        return true
      }
      return false
    } catch (error) {
      console.error('获取用户信息失败:', error)
      return false
    }
  }

  /**
   * 确保用户信息存在，如果不存在则从服务器获取
   * @returns Promise<boolean> 是否成功获取用户信息
   */
  static async ensureUserInfo(): Promise<boolean> {
    // 如果 store 中已有用户信息，直接返回 true
    if (this.memberStore.profile) {
      return true
    }

    // 否则从服务器获取
    return await this.fetchAndUpdateUserInfo()
  }

  /**
   * 清除用户信息（退出登录时使用）
   */
  static clearUserInfo(): void {
    this.memberStore.clearProfile()
  }

  /**
   * 设置用户信息（登录成功后使用）
   * @param userInfo 用户信息对象
   */
  static setUserInfo(userInfo: any): void {
    this.memberStore.setProfile(userInfo)
  }

  /**
   * 获取用户完整信息（包含默认值）
   * @returns 完整的用户信息对象
   */
  static getFullUserInfo() {
    return {
      id: this.memberStore.profile?.id || '',
      username: this.memberStore.profile?.username || '',
      name: this.getUserName(),
      department: this.getUserDepartment(),
      position: this.getUserPosition(),
      phone: this.memberStore.profile?.phone || '',
      email: this.memberStore.profile?.email || '',
      avatar: this.memberStore.profile?.avatar || '',
      avatarText: this.getUserAvatarText(),
      status: this.memberStore.profile?.status || 1,
      roles: this.memberStore.profile?.roles || [],
      permissions: this.memberStore.profile?.permissions || [],
      lastLoginTime:
        this.memberStore.profile?.lastActiveAt || this.memberStore.profile?.lastLoginTime || '',
      createdAt: this.memberStore.profile?.createTime || this.memberStore.profile?.createdAt || '',
      updatedAt: this.memberStore.profile?.updateTime || this.memberStore.profile?.updatedAt || '',
      // 添加后端返回的其他字段
      nickname: this.memberStore.profile?.nickname || '',
      deptName: this.memberStore.profile?.deptName || '',
      job: this.memberStore.profile?.job || '',
      companyName: this.memberStore.profile?.companyName || '',
      companyId: this.memberStore.profile?.companyId || '',
      mainDeptId: this.memberStore.profile?.mainDeptId || '',
      approvalLevel: this.memberStore.profile?.approvalLevel || 0,
      externalLiaison: this.memberStore.profile?.externalLiaison || 0,
    }
  }
}

/**
 * 用户信息类型定义
 */
export interface UserInfo {
  id: string
  username: string
  name: string
  department: string
  position: string
  phone: string
  email: string
  avatar: string
  status: number
  roles: string[]
  permissions: string[]
  lastLoginTime: string
  createdAt: string
  updatedAt: string
}

/**
 * 用户信息显示类型（包含计算属性）
 */
export interface UserDisplayInfo extends UserInfo {
  avatarText: string
}
